#include <mips/regdef.h>
#define STACKSP 48
#define STACKS2 44
#define STACKS1 40
#define STACKS0 36
#define STACKRA 32
#define	STACKFP 28
#define STACKGP 24
#define LA 16
#define ABA 0

//#52 a1=string2		#***************#
//#48 a0=string1               #*ABA de la caller*#
//#44 $s2			#***************#
//#40 $s1			#***************#
//#36 $s0			#***************#
//#32 $ra			#***************#
//#28 $fp			#***************#
//#24 $gp			#******SRA******#
//#20 --pad--			#***************#
//#16 i                         #*******LA******#
//#12 a3			#***************#
//#8 a2				#***************#
//#4 a1			        #***************#
//#0 a0				#ABA de MyStrCmp#
//#-----------#	

	.text
	.align 2
	.globl MyStrCmp
	.ent MyStrCmp

MyStrCmp:
	.frame $fp, STACKSP, ra
	.set noreorder
	.cpload t9
	.set reorder

	#Creacion del Stack frame
	subu sp,sp,STACKSP
	.cprestore STACKGP

	#Guardo los reg de la SRA
	sw s2, STACKS2(sp)
	sw s1, STACKS1(sp)
	sw s0, STACKS0(sp)
	sw ra, STACKRA(sp)
	sw $fp, STACKFP(sp)	
	move $fp,sp
	
	#Argument Building Area
	sw a0,STACKSP($fp) 	#Guardo string1 en el ABA de la caller
	sw a1,STACKSP+4($fp)    #Guardo string2 en el ABA de la caller
	
	#Guardo variables locales e inicializo en 0 a i, en 1 a c
   	sw zero,LA+0($fp)         #i<-0
	
	#Levanto en registros temporales los argumentos y las variables locales
	lw t0, STACKSP($fp)   #t0<-&string1(0)
	lw t4, STACKSP+4($fp) #t4<-&string2(0)
	lw t1, LA+0($fp)      #t1<- i

readByte: add t3,t0,t1       #t3<-&string1(i)
	  lbu t2, (t3)	     #t2<-string1(i)
	  add t3,t4,t1       #t3<-&string2(i)
	  lbu t5, (t3)	     #t5<-string2(i)
while: 
       bne t2,t5,finWhile 	#Si los caracteres no son iguales salgo del while
       addiu t1,t1,1		#Si son iguales, incremento i
       b readByte	        #Salto a leer el proximo byte.
finWhile: 
	move s0,t2     		#Pongo en registro a salvar t2. s0<-t2
	move s1,t5     		#Pongo en registro a salvar t5. s1<-t5
	move a0,s0     		#Preparo para la primera llamada a la funcion v0<-Posiciondelcaracter s0
	jal BuscarCaracter      #llamo a la funcion
	move s2,v0     		#Pongo en un registro a salvar el resultado. s2<-v0(posicion del caracter s0)
	move a0,s1     		#Preparo para la segunda llamada a la funcion v0<-Posiciondelcaracter s1
	jal BuscarCaracter 	#segunda llamada a la funcion
	move t0,v0         	#Pongo en un registro temporal el 2do resultado. t0<-vo(posicion del caracter s1)
	bgt s2,t0,devolverUno   #Si s2>t0 entonces devuelvo 1, si no devuelvo -1.
devolverMenosUno:
	li v0,-1
	b fin
devolverUno:
	li v0,1
fin:
	
	#Restauro los registros de la SRA
	lw s2,STACKS2(sp)  #Restauro s2
	lw s1,STACKS1(sp)  #Restauro s1
	lw s0,STACKS0(sp)  #Restauro s0
	lw $fp,STACKFP(sp)  #Restauro fp
	lw ra,STACKRA(sp)  #Restaura ra
	
   	#Destruyo el stack frame
   	addu sp,sp,STACKSP
   	j ra

.end MyStrCmp
